#ifndef THREADPOOL_H_
#define THREADPOOL_H_

#include "Thread.h"
#include "Task.h"
#include <stdint.h>
#include <list>

using namespace std;

class CWorkerThread {
public:
	CWorkerThread();
	~CWorkerThread();

	/**********************
		为什么要是静态方法？？？非静态函数出现如下编译问题：
		ThreadPool.cpp:24:43: error: invalid use of non-static member function ‘void* CWorkerThread::Execute(void*)’
		24 |  (void)pthread_create(&m_thread_id, NULL, Execute, NULL);
			|                                           ^~~~~~~~~~~~
		ThreadPool.cpp:13:7: note: declared here
		13 | void* CWorkerThread::Execute(void* arg)

		出现类型不匹配的问题。因为pthread_create需要的参数类型为void* (*)(void*)，而Execute作为类的成员函数时其类型是
		void* (CWorkerThread::)(void*)的成员函数指针。我们知道类的成员函数在经过编译器处理之后，会变成带有 this指针参
		数的全局函数，所以类型注定是不会匹配的。但是如果将Execute声明为static类型，那么编译器会将static形 式的函数，转
		换成不带this指针的全局函数，所以其类型可以与pthread_create需要的参数类型相匹配。但是类的静态成员函数无法访问类
		的非静态成员，不过这可以通过传递this指针解决这个问题。

		因此就出现了StartRoutine这个静态方法
	*********************/
	static void* StartRoutine(void* arg);

	void Start();
	void Execute();
	void PushTask(CTask* pTask);

	void SetThreadIdx(uint32_t idx) { m_thread_idx = idx; }
private:

	uint32_t		m_thread_idx;
	uint32_t		m_task_cnt;
	pthread_t		m_thread_id;
	CThreadNotify	m_thread_notify;
	list<CTask*>	m_task_list;
    bool            m_shutdown;
};

class CThreadPool {
public:
	CThreadPool();
	virtual ~CThreadPool();

	int Init(uint32_t worker_size);
	void AddTask(CTask* pTask);
	void Destory();
private:
	uint32_t 		m_worker_size;
	CWorkerThread* 	m_worker_list;
};
#endif /* THREADPOOL_H_ */